//除了互斥锁之外，还有一种锁叫做读写锁
//在读的时候，数据之间不产生影响，写和读之间，数据才产生影响

package main

import (
	"fmt"
	"sync"
	"time"
)

var wg2 = sync.WaitGroup{}

// 定义读写锁
var lock2 sync.RWMutex

func read() {
	lock2.RLock() //读方法上锁，如果只是读数据，这个锁不产生影响     如果读写同时发生的时候，就会有影响
	fmt.Println("开始读取数据")
	time.Sleep(time.Second)
	fmt.Println("读取数据成功")
	defer wg2.Done()
	lock2.Unlock()
}

func write() {

	lock2.Lock()
	fmt.Println("开始写入数据")
	time.Sleep(time.Second * 5)
	fmt.Println("修改数据成功")
	lock2.Unlock()
	defer wg2.Done()
}

// 多个协程操作同一个变量
func main() {
	wg2.Add(1)
	for i := 0; i < 5; i++ {
		go read() //启动协程
	}
	wg2.Add(1)
	go write()
	wg2.Wait()
	//这个语句一定要在wg.wait()之后输出，否则会认为只是简单的main里的一个逻辑

	//使用读写锁，在写的过程中不允许读，没有写的过程中，允许多个读
}
